package 常用类库API;
/*
 String表示一个字符串，实际使用字符数组存储
*/

public class String类原理分析
{
	public static void main(String[] args){
		System.out.println("=====直接赋值与new区别");
		//String类赋值方式
		//直接赋值，推荐. 直接赋值会把值存进堆内存里面的String常量池里面，方便调用
		String s1="你好";
		//new 关键字赋值，首先判断String常量池里面是否存在，不存在的话常量池中创建一个，常量池再又创建一个
		String s2=new String("你好");
		String s3="你好";//由于String常量池里面已经有了，所以s3实际上没有创建对象
		System.out.println(s1==s2);//false，一个指向常量池，一个指向常量池外的对象
		System.out.println(s1==s3);//true,都是指向常量池中的同一对象
		
		//编译期与运行期分析(直接赋值，常用)
		//如果在编译期可以被确定，那么使用已有对象，否则会创建对象
		System.out.println("===运行期确定分析===");
		String a="a";
		String a1=a+1;//a1只有在运行期才能被确定.堆中 创建
		String a2="a1";//常量池创建
		System.out.println(a1==a2);//不同对象返回false
		
		System.out.println("===编译器确定分析===");
		final String b="b";
		String b1=b+1;
		String b2="b1";
		System.out.println(b1==b2);//aide中是false但是电脑上是true
		
		System.out.println("==运行期确定===");
		String c=getC();
		String c1=c+1;
		String c2="c1";
		System.out.println(c1==c2);
		
		final String d=getC();
		String d1=d+1;
		String d2="d1";
		System.out.println(d1==d2);
	}
	public static String getC(){
		return "c";
	}
	public static String getD(){
		return "d";
	}
}
